import { FrameCollection } from "./FrameCollection";
import { LogStackFrame } from "./LogStackFrame";

export class LogCollection extends FrameCollection<LogStackFrame> {
    /**
     * @description: 从当前的集合当中过滤符合条件的元素。
     * @param {Function} callbackFn 用来测试数组中每个元素的函数。返回 `true` 表示该元素通过测试，保留该元素， `false` 则不保留。它接受以下三个参数：
     * - `element` 数组中当前正在处理的元素。
     * - `index` 正在处理的元素在数组中的索引。
     * - `array` 调用了 `filter()` 的数组本身。
     * @return {LogCollection} 过滤出的符合条件的日志组成的新集合。
     */
    public filter(callbackFn: (frame: LogStackFrame, index: number, array: LogStackFrame[]) => boolean): LogCollection {
        let result = new LogCollection();
        let tempFrame: LogStackFrame;

        for (let i = 0; i < this.frames.length; i++) {
            tempFrame = this.frames[i];
            if (callbackFn(tempFrame, i, this.frames)) {
                result.push(tempFrame);
            }
        }

        return result;
    }

    /**
     * @description: 将日志集合转换为 html 字符串用于发送日志。
     * @return {string} 转换后的字符串。
     */
    public toHtmlString(): string {
        let stack: string[] = [
            `<div style="
                font-size: 15px;
                font-family: monospace;
                word-wrap:break-word;
            ">`
        ];

        for (let i = 0; i < this.frames.length; i++) {
            stack.push(this.frames[i].toHtmlString());
        }
        stack.push('</div>')

        return stack.join('\n');
    }

    /**
     * @description: 将日志集合逐个转换为字符串。
     * @return {string[]} 将集合中元素转换为字符串后的数组。
     */
    public toStringArray(): string[] {
        let stack: string[] = [];

        for (let i = 0; i < this.frames.length; i++) {
            stack.push(this.frames[i].toString());
        }

        return stack;
    }

    /**
     * @description: 将日志集合转换为字符串。
     * @return {string} 将日志集合元素转换为字符串后使用换行符拼接的字符串。
     */
    public toString(): string {
        let stack: string[] = [];

        for (let i = 0; i < this.frames.length; i++) {
            stack.push(this.frames[i].toString());
        }

        return stack.join('\n');
    }
}
